/*
* The MIT License
*
* Copyright (c) 2010-2011 Simon Westcott
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package org.jenkinsci.plugins.bulkbuilder.model;
import hudson.model.BooleanParameterDefinition;
import hudson.model.FreeStyleProject;
import hudson.model.ParametersDefinitionProperty;
import hudson.model.StringParameterDefinition;
import java.util.Map;
import org.junit.After;
import org.junit.Ignore;
import org.junit.Test;
import org.jvnet.hudson.test.FailureBuilder;
import org.jvnet.hudson.test.HudsonTestCase;
import org.jvnet.hudson.test.UnstableBuilder;
import org.jvnet.hudson.test.recipes.PresetData;
import org.jvnet.hudson.test.recipes.PresetData.DataSet;
/**
* @author simon
*/
public class BuilderTest extends HudsonTestCase {
private Builder builder;
// Successful
private FreeStyleProject project1;
private int project1NextBuildNumber;
// Failure
private FreeStyleProject project2;
private int project2NextBuildNumber;
// Unstable
private FreeStyleProject project3;
private int project3NextBuildNumber;
// Not Built
private FreeStyleProject project4;
private int project4NextBuildNumber;
// Disabled
private FreeStyleProject project5;
private int project5NextBuildNumber;
@After
@Override
public void tearDown() throws Exception {
super.tearDown();
builder = null;
project1 = project2 = project3 = project4 = project5 = null;
project1NextBuildNumber = project2NextBuildNumber = project3NextBuildNumber = project4NextBuildNumber = project5NextBuildNumber = -1;
}
private void setUpBasicJobs() throws Exception {
project1 = createFreeStyleProject("success");
project1.scheduleBuild2(0).get();
project2 = createFreeStyleProject("fail");
project2.getBuildersList().add(new FailureBuilder());
project2.scheduleBuild2(0).get();
project3 = createFreeStyleProject("unstable");
project3.getBuildersList().add(new UnstableBuilder());
project3.scheduleBuild2(0).get();
project4 = createFreeStyleProject("not built");
project5 = createFreeStyleProject("disabled");
project5.disable();
waitUntilNoActivity();
builder = new Builder(BuildAction.valueOf("IMMEDIATE_BUILD"));
project1NextBuildNumber = project1.getNextBuildNumber();
project2NextBuildNumber = project2.getNextBuildNumber();
project3NextBuildNumber = project3.getNextBuildNumber();
project4NextBuildNumber = project4.getNextBuildNumber();
project5NextBuildNumber = project5.getNextBuildNumber();
}
/**
* Test of buildAll method.
*/
@Test
public void testBuildAll() throws Exception {
setUpBasicJobs();
assertEquals(4, builder.buildAll());
waitUntilNoActivity();
assertEquals(project1NextBuildNumber, project1.getLastBuild().getNumber());
assertEquals(project2NextBuildNumber, project2.getLastBuild().getNumber());
assertEquals(project3NextBuildNumber, project3.getLastBuild().getNumber());
assertEquals(project4NextBuildNumber, project4.getLastBuild().getNumber());
assertNull(project5.getLastBuild());
}
/**
* Test of buildFailed method.
*/
@Test
public void testBuildFailed() throws Exception {
setUpBasicJobs();
assertEquals(2, builder.buildFailed());
waitUntilNoActivity();
assertEquals(project1NextBuildNumber, project1.getNextBuildNumber());
assertEquals(project2NextBuildNumber, project2.getLastBuild().getNumber());
assertEquals(project3NextBuildNumber, project3.getNextBuildNumber());
assertEquals(project4NextBuildNumber, project4.getLastBuild().getNumber());
assertNull(project5.getLastBuild());
}
/**
* Test of buildUnstableOnly method.
*/
@Test
public void testBuildUnstableOnly() throws Exception {
setUpBasicJobs();
assertEquals(1, builder.buildUnstableOnly());
waitUntilNoActivity();
assertEquals(project1NextBuildNumber, project1.getNextBuildNumber());
assertEquals(project2NextBuildNumber, project2.getNextBuildNumber());
assertEquals(project3NextBuildNumber, project3.getLastBuild().getNumber());
assertEquals(project4NextBuildNumber, project4.getNextBuildNumber());
assertNull(project5.getLastBuild());
}
/**
* Test of buildPattern method.
*/
@Test
public void testBuildPattern() throws Exception {
setUpBasicJobs();
builder.setPattern("*a*");
assertEquals(2, builder.buildAll());
waitUntilNoActivity();
assertEquals(project1NextBuildNumber, project1.getNextBuildNumber());
assertEquals(project2NextBuildNumber, project2.getLastBuild().getNumber());
assertEquals(project3NextBuildNumber, project3.getLastBuild().getNumber());
assertEquals(project4NextBuildNumber, project4.getNextBuildNumber());
assertNull(project5.getLastBuild());
}
/**
* Test user has necessary permission to build job.
*/
// @Test
@Ignore("PresetData isn't working correctly")
@PresetData(DataSet.ANONYMOUS_READONLY)
public void atestInsufficientBuildPermission() throws Exception {
FreeStyleProject project = createFreeStyleProject("restricted");
project.scheduleBuild2(0).get();
waitUntilNoActivity();
builder = new Builder(BuildAction.valueOf("IMMEDIATE_BUILD"));
builder.setPattern("restricted");
assertEquals(0, builder.buildAll());
assertEquals(1, project.getNextBuildNumber());
}
/**
* Test parameterized job is passed user supplied string parameters
* and uses default value for non-string parameters.
*/
@Test
public void testParameterisedBuildWithUserSuppliedParameter() throws Exception {
FreeStyleProject paramJob = createFreeStyleProject("paramJob");
StringParameterDefinition spd = new StringParameterDefinition("foo", "bar");
ParametersDefinitionProperty spdp = new ParametersDefinitionProperty(spd);
paramJob.addProperty(spdp);
BooleanParameterDefinition bpd = new BooleanParameterDefinition("foo2", true, "Test");
ParametersDefinitionProperty bpdp = new ParametersDefinitionProperty(bpd);
paramJob.addProperty(bpdp);
waitUntilNoActivity();
BulkParamProcessor processor = new BulkParamProcessor("foo=baz");
builder = new Builder(BuildAction.valueOf("IMMEDIATE_BUILD"));
builder.setPattern("paramJob");
builder.setUserParams(processor.getProjectParams());
assertEquals(1, builder.buildAll());
waitUntilNoActivity();
Map<String, String> buildVariables = paramJob.getLastBuild().getBuildVariables();
assertEquals("baz", buildVariables.get("foo"));
}
/**
* Test parameterized job uses default value when no parameters specified by user
*/
@Test
public void testParameterisedBuildWithNoUserSuppliedParameter() throws Exception {
FreeStyleProject paramJob = createFreeStyleProject("paramJob");
StringParameterDefinition spd = new StringParameterDefinition("foo", "bar");
ParametersDefinitionProperty pdp = new ParametersDefinitionProperty(spd);
paramJob.addProperty(pdp);
waitUntilNoActivity();
builder = new Builder(BuildAction.valueOf("IMMEDIATE_BUILD"));
builder.setPattern("paramJob");
assertEquals(1, builder.buildAll());
waitUntilNoActivity();
Map<String, String> buildVariables = paramJob.getLastBuild().getBuildVariables();
assertEquals("bar", buildVariables.get("foo"));
}
}